﻿using System;
using System.Linq;
using System.Web.Mvc;
using TaskManager.Models;

namespace TaskManager.Controllers
{
    public class HomeController : Controller
    {
        /// <summary>
        /// 数据上下文
        /// </summary>
        readonly Model1 model = new Model1();

        /// <summary>
        /// 搜索数据
        /// </summary>
        /// <param name="uid">所属用户</param>
        /// <param name="Content">内容关键字（模糊查询）</param>
        /// <returns></returns>
        public ActionResult Index(int uid = 0, string Content = "")
        {
            //获取所有用户列表
            var users = model.UserInfo.ToList();
            //在用户列表开始位置添加全部选项
            users.Insert(0, new UserInfo() { name = "全部", uid = 0 });
            //生成下拉框数据，属性名与实体属性保持一致
            ViewBag.uid = new SelectList(users, "uid", "name");
            //根据条件查询数据
            var list = model.Task.Where(p => p.Content.Contains(Content) && (uid == 0 || p.uid == uid)).ToList();
            //将数据传递到页面
            return View(list);
        }

        /// <summary>
        /// 显示添加页面
        /// </summary>
        /// <returns></returns>
        public ActionResult Create()
        {
            //生成下拉框数据，属性名与实体属性保持一致
            ViewBag.uid = new SelectList(model.UserInfo, "uid", "name");
            //显示添加页面
            return View();
        }

        /// <summary>
        /// 处理添加请求
        /// </summary>
        /// <param name="task">实体对象</param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult Create(Task task)
        {
            //判读前端传递过来的数据是否满足注释属性的验证规则
            if (ModelState.IsValid)
            {
                //与用户交互的属性，直接使用传递的数据
                //未与用户交互且默认值与数据库默认值不一致的，必须重新赋值为数据库默认值
                task.AddTime = DateTime.Now;
                task.TaskState = 1;
                task.FinishedTime = null;

                //将数据添加到数据集
                model.Task.Add(task);
                //将更改保存到数据库
                var res = model.SaveChanges();
                if (res > 0)
                {
                    //如果添加成功，返回列表页面
                    return RedirectToAction("Index");
                }
            }
            //否则，停留在添加页面
            //生成下拉框数据，属性名与实体属性保持一致
            ViewBag.uid = new SelectList(model.UserInfo, "uid", "name");
            return View(task);
        }

        /// <summary>
        /// 显示修改页面
        /// </summary>
        /// <param name="id">主键</param>
        /// <returns></returns>
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                //如果参数为null，则返回列表页面
                return RedirectToAction("Index");
            }
            //查询需要修改的数据
            var task = model.Task.FirstOrDefault(p => p.TaskID == id);
            if (task == null)
            {
                //如果未找到数据，则返回列表页面
                return RedirectToAction("Index");
            }
            //显示原始数据
            //生成下拉框数据，属性名与实体属性保持一致
            //数据源，值属性，显示属性，默认值
            ViewBag.uid = new SelectList(model.UserInfo, "uid", "name", task.uid);
            return View(task);
        }

        /// <summary>
        /// 处理修改请求
        /// </summary>
        /// <param name="task"></param>
        [HttpPost]
        public ActionResult Edit(Task task)
        {
            //判读前端传递过来的数据是否满足注释属性的验证规则
            if (ModelState.IsValid)
            {
                //查询需要修改的数据
                var temp = model.Task.FirstOrDefault(p => p.TaskID == task.TaskID);
                if (temp == null)
                    //如果未找到数据，则返回列表页面
                    return RedirectToAction("Index");
                //修改属性值，只修改前台传回来的数据；其他属性数据，须根据业务需求修改
                temp.Content = task.Content;
                temp.FinishedTime = task.FinishedTime;
                temp.TaskPriority = task.TaskPriority;
                temp.TaskState = task.TaskState;
                temp.uid = task.uid;
                //将更改保存到数据库
                var res = model.SaveChanges();
                if (res > 0)
                    //如果添加成功，返回列表页面
                    return RedirectToAction("Index");
            }
            //显示原始数据
            //生成下拉框数据，属性名与实体属性保持一致
            ViewBag.uid = new SelectList(model.UserInfo, "uid", "name", task.uid);
            return View(task);
        }

        /// <summary>
        /// 显示详情页面
        /// </summary>
        /// <param name="id">主键</param>
        /// <returns></returns>
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                //如果参数为null，则返回列表页面
                return RedirectToAction("Index");
            }
            //查询需要修改的数据
            var task = model.Task.FirstOrDefault(p => p.TaskID == id);
            if (task == null)
            {
                //如果未找到数据，则返回列表页面
                return RedirectToAction("Index");
            }
            //显示原始数据
            return View(task);
        }

        /// <summary>
        /// 处理删除请求
        /// </summary>
        /// <param name="id">主键</param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                //如果参数为null，则返回false
                return Json(false);
            }
            //查询需要删除的数据
            var task = model.Task.FirstOrDefault(p => p.TaskID == id);
            if (task == null)
            {
                //如果未找到数据，则返回false
                return Json(false);
            }
            //从数据集中删除数据
            model.Task.Remove(task);
            //将更改保存到数据库
            var res = model.SaveChanges();
            //返回删除结果
            return Json(res > 0);
        }
    }
}